#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <stack>
using namespace std;
const int MAXN=400050;
char s[MAXN];
int Next[MAXN];
void kmp_pre(char* s){
    int l=strlen(s);
    int i=0;
    int j=-1;
    Next[0]=-1;
    while(i<l){
        if(j==-1 || s[i]==s[j]){
            i++;
            j++;
            Next[i]=j;
        }
        else{
            j=Next[j];
        }
    }
}
int main(void){
    while(~scanf("%s",s)){
        memset(Next,0,sizeof(Next));
        kmp_pre(s);
        vector<int> res;
        int len=strlen(s);
        /*
        printf(" ");
        for(int i=0;i<len;i++){
            printf("%c ",s[i]);
        }
        printf("\n");
        for(int i=0;i<=len;i++){
            printf("%d ",Next[i]);
        }
        printf("\n");
        */
        stack<int> s;
        s.push(len);
        while(len!=0 && Next[len]!=0){
            s.push(Next[len]);
            //跳到这个相同前缀的最后一个字符后
            //因为这个前缀字符串和后缀字符串是一样的
            //所以这时也相当于在后缀字符串的最后一个字符后
            //所以这时候再看next值也就是这个前缀字符串里的相同前缀后缀
            //很巧妙的就是此时这个前缀的前缀就和之前那个后缀的后缀相同！！
            //因为刚才已经说过第一次跳过来那个前缀和后缀是一样的
            //那么这个前缀的相同前缀后缀也就相当于那个后缀的前缀后缀！！
            //例如：
            //          a a b a a b a a b a a
            //next数组：-1 0 1 0 1 2 3 4 5 6 7 8
            //首先是整个字符串长度11 然后检查Next[11]，也就是前11个字符的最大前缀后缀长度
            //发现是8，然后这时候整个字符串就分为两部分(相同前缀后缀)各8个字符，有重复
            //然后检查Next[8]就是前面的这一部分8个字符的最长前缀后缀长度 发现是5 
            //也就是说这8个字符被分为两部分各(相同前缀后缀)5个字符，很巧妙的就是这时候第二部分8个字符
            //也被分为两部分各5个字符了,所以这时候整个完整的字符串就有5个字符的相同前缀后缀！！
            len=Next[len];
        }
        while(s.size()){
            printf("%d ",s.top());
            s.pop();
        }
        printf("\n");
    }
    return 0;
}